#include "images.h"

/* routine d'elimination des commentaires */
void img_lecture_buffer(char * tmp, FILE *f)
{
  do
    {
    fgets(tmp, MAX_BUFFER, f);
    }
  while(tmp[0] == '#');
}

/* chargement d'une image au format PPM sans allocation */
int charge_ppm(char *nom, SImage *image)
{
  FILE *f;
  int i, j;
  char buf[MAX_BUFFER];
  int coul;  /* couleur ou pas ? */

  if (image->buffer == NULL)
    {
    fprintf(stderr, "Buffer image non alloue!\n");
    image->mode = IMAGE_ERREUR;
    return(FALSE);
    }
  /* ouverture fichier */
  if ((f = fopen(nom, "r")) == NULL)
    {
    fprintf(stderr, "Impossible d'ouvrir le fichier '%s'.\n", nom);
    image->mode = IMAGE_ERREUR;
    return(FALSE);
    }

  /* lecture entete */
  img_lecture_buffer(buf, f);
  if (strncmp(buf, "P5", 2) == 0)
    {
    coul = FALSE;
    image->mode = IMAGE_GRIS;
    }
  else
  if (strncmp(buf, "P6", 2) == 0)
    {
    coul = TRUE;
    image->mode = IMAGE_COULEUR;
    }
  else
    {
    fprintf(stderr, "L'image n'est pas a un format PPM reconnu.\n");
    fclose(f);
    image->mode = IMAGE_ERREUR;
    return(FALSE);
    }

  /* largeur/hauteur */
  img_lecture_buffer(buf, f);
  sscanf(buf, "%d %d", &(image->largeur), &(image->hauteur));
  /* taille palette (255). non teste. */
  img_lecture_buffer(buf, f);

  /* lecture image */
  for(j=image->hauteur-1; j>=0; j--)
    {
    for(i=0; i<image->largeur; i++)
      {
      if (coul)
        {
	image->buffer[(i+j*(image->largeur))*4]   = (unsigned char)fgetc(f);
	image->buffer[(i+j*(image->largeur))*4+1] = (unsigned char)fgetc(f);
	image->buffer[(i+j*(image->largeur))*4+2] = (unsigned char)fgetc(f);
        image->buffer[(i+j*(image->largeur))*4+3] = 255;
	}
      else
	{
	image->buffer[(i+j*(image->largeur))] = (unsigned char)fgetc(f);
	}
      }
    }

  /* fini */
  fclose(f);
  return(TRUE);
}

/* chargement d'une image au format PPM avec allocation */
int charge_allocation_ppm(char *nom, SImage *image)
{
  FILE *f;
  int i, j;
  char buf[MAX_BUFFER];
  int coul;  /* couleur ou pas ? */

  /* ouverture fichier */
  if ((f = fopen(nom, "r")) == NULL)
    {
    fprintf(stderr, "Impossible d'ouvrir le fichier '%s'.\n", nom);
    image->mode = IMAGE_ERREUR;
    return(FALSE);
    }

  /* lecture entete */
  img_lecture_buffer(buf, f);
  if (strncmp(buf, "P5", 2) == 0)
    {
    coul = FALSE;
    image->mode = IMAGE_GRIS;
    }
  else
  if (strncmp(buf, "P6", 2) == 0)
    {
    coul = TRUE;
    image->mode = IMAGE_COULEUR;
    }
  else
    {
    fprintf(stderr, "L'image n'est pas a un format PPM reconnu.\n");
    fclose(f);
    image->mode = IMAGE_ERREUR;
    return(FALSE);
    }

  /* largeur/hauteur */
  img_lecture_buffer(buf, f);
  sscanf(buf, "%d %d", &(image->largeur), &(image->hauteur));
  /* taille palette (255). non teste. */
  img_lecture_buffer(buf, f);

  /* allocation de la memoire */
  if ((image->buffer = malloc(sizeof(unsigned char)*
           image->largeur*image->hauteur*(coul?4:1))) == NULL)
    {
    fprintf(stderr, "Memoire inssufisante.\n");
    fclose(f);
    image->mode = IMAGE_ERREUR;
    image->buffer = NULL;
    return(FALSE);
    }

  /* lecture image */
  for(j=image->hauteur-1; j>=0; j--)
    {
    for(i=0; i<image->largeur; i++)
      {
      if (coul)
        {
	image->buffer[(i+j*(image->largeur))*4]   = (unsigned char)fgetc(f);
	image->buffer[(i+j*(image->largeur))*4+1] = (unsigned char)fgetc(f);
	image->buffer[(i+j*(image->largeur))*4+2] = (unsigned char)fgetc(f);
        image->buffer[(i+j*(image->largeur))*4+3] = 255;
	}
      else
	{
	image->buffer[(i+j*(image->largeur))] = (unsigned char)fgetc(f);
	}
      }
    }

  /* fini */
  fclose(f);
  return(TRUE);
}


/* sauvegarde une image au format PPM */
int sauvegarde_ppm(char *nom, SImage *image)
{
  FILE *f;
  int i, j;

  if ((image->mode != IMAGE_GRIS)&&(image->mode != IMAGE_COULEUR))
    {
    fprintf(stderr, "Type image invalide.\n");
    return(FALSE);
    }

  /* ouverture fichier */
  if ((f = fopen(nom, "w")) == NULL)
    {
    fprintf(stderr, "Impossible d'ouvrir le fichier '%s'.\n", nom);
    return(FALSE);
    }

  /* ecriture entete */
  if (image->mode == IMAGE_COULEUR)
    fprintf(f, "P6\n# CREATOR: Hexasoft Corp.\n"); /* header */
  else
    fprintf(f, "P5\n# CREATOR: Hexasoft Corp.\n"); /* header */
  fprintf(f, "%d %d\n255\n", image->largeur, image->hauteur);  /* taille et palette */

  /* ecriture des donnees */
  for(j=image->hauteur-1; j>=0; j--)
    for(i=0; i<image->largeur; i++)
      {
      if (image->mode == IMAGE_COULEUR)
        fprintf(f, "%c%c%c", image->buffer[(i+j*image->largeur)*4],
	  	             image->buffer[(i+j*image->largeur)*4+1],
		             image->buffer[(i+j*image->largeur)*4+2]);
      else
        fprintf(f, "%c", image->buffer[(i+j*image->largeur)]);
      }

  /* fini */
  fclose(f);
  return(TRUE);
}

int detruit_ppm(SImage *image)
{
  if (image->buffer == NULL)
    return(FALSE);
  
  free(image->buffer);
  image->largeur = image->hauteur = 0;
  image->buffer = NULL;
  image->mode = IMAGE_ERREUR;

  return(TRUE);
}


